import sys, os, platform, csv, random, shutil

from banco.Banco import Banco

from tabela.Tabela import Tabela
from campo.Campo import Campo
from arquivoCSV.Arquivo import ArquivoCSV

class MassaDados():
    
    def __init__(self, registros, arquivoCSV):
                    
        self.registros  = registros
        self.arquivoCSV = arquivoCSV
        self.listaCaminhoArquivo = os.path.split(arquivoCSV)
        
    def __getattr__(self, name):
        
        if name == "registros":
            return self.registros
        
        elif name == "arquivoCSV":
            return self.arquivoCSV

        elif name == "listaCaminhoArquivo":
            return self.listaCaminhoArquivo

        else:
            raise AttributeError, name


    def __setattr__(self, name, value):

                
        if name == "registros":
            self.__dict__["registros"] = value
            
        elif name == "arquivoCSV":
            self.__dict__["arquivoCSV"] = value

        elif name == "listaCaminhoArquivo":
            self.__dict__["listaCaminhoArquivo"] = value

        else:
            raise AttributeError, name

    
    def prepara_banco(self, banco, host, usuario, senha, nome, tipo):
        
        banco.__setattr__('host', host)
        banco.__setattr__('usuario', usuario)
        banco.__setattr__('senha', senha)
        banco.__setattr__('nome', nome)
        banco.__setattr__('tipo', tipo)
        
        return banco
        
    def insere_massa_dados(self, isChecked, host, usuario, senha, nome, tipo):
        
        try:
            
            registros  = self.__getattr__('registros')
            
            banco = Banco()
            banco = self.prepara_banco(banco, host, usuario, senha, nome, tipo)
            
            if isChecked: 
                self.insere_tabela(banco)
            
            query = self.geraQueryDados(int(registros))
            
            if banco.__getattr__('tipo') == "Mysql":
                banco.executa_query_Mysql(query)
            
            if banco.__getattr__('tipo') == "Postgre":
                banco.executa_query_Postgre(query)
                                            
        except Exception, e:
            print "Erro ao inserir dados no banco"
            print e    
    
    def insere_tabela(self, banco):
                    
        query = self.geraQueryTabela()
        
        if banco.__getattr__('tipo') == "Mysql":
            banco.executa_query_Mysql(query)
        
        if banco.__getattr__('tipo') == "Postgre":
            banco.executa_query_Postgre(query)
                    
    def cria_arquivo_saida(self, arquivo, caminho, extensao, query):
        
        arquivoCSV = arquivo
        arquivoCSV = arquivoCSV.replace('.csv', extensao)
        
        if platform.platform().startswith('Windows'):
            caminho = caminho.replace("/", "\\")
            arquivo_saida = open(caminho + "\\" +arquivoCSV, "w")
        
        else:
            arquivo_saida = open(caminho + "/" + arquivoCSV, "w")
        
        arquivo_saida.write(query)
        arquivo_saida.close()
                
    def cria_arquivos_sql(self):
         
        registros = self.__getattr__('registros')
        arquivo   = self.__getattr__('listaCaminhoArquivo')[1]
        caminho   = self.__getattr__('listaCaminhoArquivo')[0]
        
        query = self.geraQueryDados(int(registros))
        self.cria_arquivo_saida(arquivo, caminho, "_massa_dados.sql", query)
        
        query = self.geraQueryTabela()
        self.cria_arquivo_saida(arquivo, caminho, "_tabelas.sql", query)

    
    def geraQueryDados(self, entradas):
    
        query = ""
    
        arquivoCSV = self.__getattr__('arquivoCSV')
        
        arquivo_csv = ArquivoCSV()
        arquivo_csv.__setattr__('arquivo_csv', arquivoCSV)
        arquivo_csv.carregaDadosCSV()
        
        tab = Tabela()
        tab.__setattr__('arquivo_csv', arquivo_csv)
        tab.criaListaTabelas()
        
        for tabela in tab.__getattr__('lista_tabelas'):
            
            tab.__setattr__('nome', tabela)
            query+= "DELETE FROM " + str(tab.__getattr__('nome')) + ";\n"
            
            for i in range(entradas):
                query += "INSERT INTO " + str(tab.__getattr__('nome')) + " VALUES (" 
                
                tab.criaListaCampos(tab.__getattr__('nome'))
                tab.numCamposTabela(tab.__getattr__('nome'))
                
                for campos in tab.__getattr__('lista_campos'):
                    
                    campo = campos.__getattr__('nome') 
                    tipo  = campos.__getattr__('tipo') 
                    
                    if tipo.find('AUTO_INCREMENT') != -1 or tipo.find('auto_increment') != -1:
                        continue
                    
                    if campo == 'ID' or campo == 'id':
                        query += str(i) + ","                                
                    
                    else:
                        valores = campos.__getattr__('valores')      
                        valores = self.sorteiaItem(valores)
                        
                        if tipo.find('CHAR') != -1 or tipo.find('char') != -1:
                            query+= "\'" + valores + "\',"
                        
                        if tipo.find('INTEGER') != -1 or tipo.find('integer') != -1 or tipo.find('INT') != -1 or tipo.find('int') != -1:
                            query+= valores + ","
                        
                query += ");"
                query = query.replace(",);", ");")
                query+="\n"
            
            query+="\n"
            
        return query
    
    def geraQueryTabela(self):
        
        query    = ""
        arquivoCSV = self.__getattr__('arquivoCSV')
        
        arquivo_csv = ArquivoCSV()
        arquivo_csv.__setattr__('arquivo_csv', arquivoCSV)
        arquivo_csv.carregaDadosCSV()
        
        tab = Tabela()
        tab.__setattr__('arquivo_csv', arquivo_csv)
        tab.criaListaTabelas()
        
        for tabela in tab.__getattr__('lista_tabelas'):
            
            tab.__setattr__('nome', tabela)
            query+= "CREATE TABLE " + str(tab.__getattr__('nome')) + "(\n"
            
            tab.criaListaCampos(tab.__getattr__('nome'))
            tab.numCamposTabela(tab.__getattr__('nome'))
                
            for campos in tab.__getattr__('lista_campos'):
                
                campo = campos.__getattr__('nome') 
                tipo  = campos.__getattr__('tipo') 
                query+= "\t" + str(campo) + "\t" + str(tipo) + ",\n"
    
            query += ");"
            query = query.replace(",\n);", ");")
            query+="\n"
            
        return query

    def formata_string(self, string):
    
        aux = string
        aux = aux.replace('\'','')
        aux = aux.replace('\"','')
        aux = aux.replace('[','')
        aux = aux.replace(']','')
        aux = aux.strip()
    
        return aux
            
    def sorteiaItem(self, valores):
        
        try:
            sorteado = ""        
            if type(valores) == str:
                sorteado = self.formata_string(str(random.sample(valores.split(','),1)))
            
            return sorteado
            
        except Exception, e:
            print "Erro ao sortear item de dados"
            print e
            
            